#include "ThreadPool.hpp"  // 包含线程池头文件
#include <iostream>
#include <chrono>
#include <string>
#include <atomic>
#include<thread>

// 全局原子变量，用于验证任务执行数量
std::atomic<int> g_task_count(0);

// 1. 测试无参数普通函数
void print_hello() {
    // 打印当前执行线程ID和任务信息
    std::cout << "[线程 " << std::this_thread::get_id() << "] 执行 print_hello()\n";
    std::this_thread::sleep_for(std::chrono::milliseconds(100));  // 模拟任务耗时
    g_task_count++;  // 任务计数+1
}

// 2. 测试带参数函数
void print_info(int id, const std::string& msg) {
    std::cout << "[线程 " << std::this_thread::get_id() << "] 执行 print_info()，ID=" << id << "，消息：" << msg << "\n";
    std::this_thread::sleep_for(std::chrono::milliseconds(150));
    g_task_count++;
}

// 3. 测试带捕获的lambda表达式（复杂任务）
void test_lambda_tasks(ThreadPool& pool) {
    for (int i = 0; i < 3; ++i) {
        // 捕获循环变量i，提交lambda任务
        pool.Post([i]() {
            std::cout << "[线程 " << std::this_thread::get_id() << "] 执行 lambda 任务，编号：" << i << "\n";
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
            g_task_count++;
        });
    }
}

int main() {
    // 创建包含2个工作线程的线程池
    ThreadPool pool(2);
    std::cout << "主线程ID：" << std::this_thread::get_id() << "\n\n";

    // 提交任务到线程池
    // 提交普通函数（无参数）
    pool.Post(print_hello);
    pool.Post(print_hello);

    // 提交带参数函数
    pool.Post(print_info, 100, "这是第一个带参数任务");
    pool.Post(print_info, 200, "这是第二个带参数任务");

    // 提交lambda任务
    test_lambda_tasks(pool);

    // 等待所有任务执行完毕（根据任务总数量和耗时估算等待时间）
    // 总任务数：2（print_hello） + 2（print_info） + 3（lambda） = 7个
    std::this_thread::sleep_for(std::chrono::seconds(3));

    // 验证任务执行结果
    std::cout << "\n所有任务执行完毕，实际执行任务数：" << g_task_count << "（预期：7）\n";
    std::cout << "主线程退出\n";

    return 0;
}